package com.example.juccode.juc02completableFuture.demo;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author: zhongkui 1365693530@qq.com
 * @Date: 2025/2/12
 */
public class CompletableFutureApi2Demo {
    public static void main(String[] args) {
//        ○ thenApply --->计算结果存在依赖关系，这两个线程串行化
//                ---->由于存在依赖关系（当前步错，不走下一步），当前步骤有异常的话就叫停
//        ○ handle --->计算结果存在依赖关系，这两个线程串行化
//                ---->有异常也可以往下走一步
        ExecutorService threadPool = Executors.newFixedThreadPool(3);

        CompletableFuture.supplyAsync(() -> {
            try {TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();}
            System.out.println("111");
            return 1;
        },threadPool).handle((f,e) ->{
            int i = 10/0;
            System.out.println("222");
            return f + 2;
        }).handle((f,e) ->{
            System.out.println("333");
            return f + 3;
        }).whenComplete((v, e) -> {
            //没有异常
            if (e == null){
                System.out.println("------计算结果:" + v);
            }
        }).exceptionally(e -> {
            System.out.println("------计算异常--" + e.getMessage());
            e.printStackTrace();
            return null;
        });
        System.out.println(Thread.currentThread().getName() + "--线程，先去忙其他任务");

        threadPool.shutdown();
    }
}
